package data

import (
	"context"
	"encoding/json"
	"github.com/duke-git/lancet/v2/slice"
	"google.golang.org/grpc/encoding"
	pb "kratosGin/api/helloworld/v1"
	"kratosGin/internal/biz"
)

/*
 "encoding/json"
 "google.golang.org/grpc/encoding"
*/

// Notice 使用 proto 生成的结构体 模拟调用RPC返回的结果
func (g *ginRepo) ListFruits(ctx context.Context) (any, error) {

	modelSlice := make([]*biz.Fruit, 0)

	// 这里为了演示效果 简写了，实际上应该有 limit+offset
	errFind := g.data.Mysql.Table(biz.FruitTableName).WithContext(ctx).Find(&modelSlice).Error
	if errFind != nil {
		return nil, errFind
	}

	// 模拟调用RPC返回的结果，这里需要转一下结构
	// Notice 方法1: 有 omitempty属性的json标签 "零值"字段不会在HTTP接口中返回！
	//retSlice := slice.Map(modelSlice, func(index int, item *biz.Fruit) *pb.FruitBase {
	//	return &pb.FruitBase{
	//		Id:         item.Id,
	//		FruitType:  item.FruitType,
	//		FruitName:  item.FruitName,
	//		FruitPrice: item.FruitPrice,
	//	}
	//})

	// Notice 方法2: 有 imitempty属性的json标签 "零值"字段在HTTP接口中返回的方法
	//retSlice := slice.Map(modelSlice, func(index int, item *biz.Fruit) json.RawMessage {
	//	currItem := &pb.FruitBase{
	//		Id:         item.Id,
	//		FruitType:  item.FruitType,
	//		FruitName:  item.FruitName,
	//		FruitPrice: item.FruitPrice,
	//	}
	//
	//	// "透传"
	//	jsonRaw, _ := encoding.GetCodec("json").Marshal(currItem)
	//
	//	return jsonRaw
	//})

	// Notice 演示效果3: 实际上会遇到一个坑: 使用 方法2 得到的结果是 "驼峰",但是 方法1 中根据proto的定义是下划线风格返回的!!!
	// Notice 如果实际中先使用了方法2进行 "透传"，但是因为某次业务迭代，修改成了方法1的模式，一定要记得 转回来！！！否则前端之前解析的是驼峰，修改后变成下划线就会有问题！
	retSlice := slice.Map(modelSlice, func(index int, item *biz.Fruit) json.RawMessage {
		currItem := &pb.FruitBase{
			Id:         item.Id,
			FruitType:  item.FruitType,
			FruitName:  item.FruitName + "😊",
			FruitPrice: item.FruitPrice,
		}

		// "透传"
		jsonRaw, _ := encoding.GetCodec("json").Marshal(currItem)

		return jsonRaw
	})

	return retSlice, nil
}
